package kr.co.bettersoft.waitnumbercustomer.fragment;

import java.io.ByteArrayOutputStream;
import java.io.InputStream;

import org.apache.http.HttpEntity;
import org.apache.http.HttpResponse;
import org.apache.http.HttpStatus;
import org.apache.http.client.methods.HttpGet;
import org.json.JSONException;
import org.json.JSONObject;

import com.google.zxing.BarcodeFormat;
import com.google.zxing.MultiFormatWriter;
import com.google.zxing.common.BitMatrix;

import kr.co.bettersoft.waitnumbercustomer.activity.DummyActivity;
import kr.co.bettersoft.waitnumbercustomer.activity.MemberStoreInfoActivity;
import kr.co.bettersoft.waitnumbercustomer.activity.R;
import kr.co.bettersoft.waitnumbercustomer.common.CommonConstant;
import kr.co.bettersoft.waitnumbercustomer.common.WaitNumberCustomerRest;
import kr.co.bettersoft.waitnumbercustomer.domain.MemberUser;
import kr.co.bettersoft.waitnumbercustomer.domain.Merchant;
import android.app.AlertDialog;
import android.content.ContentValues;
import android.content.Context;
import android.content.DialogInterface;
import android.content.Intent;
import android.content.SharedPreferences;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Typeface;
import android.net.http.AndroidHttpClient;
import android.os.AsyncTask;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.support.v4.app.Fragment;
import android.util.Base64;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.ImageView;
import android.widget.ProgressBar;
import android.widget.RatingBar;
import android.widget.TextView;

public class MyQRScreenFragment extends Fragment {
	
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////
	// 변수
		
		public String TAG = "MyQRScreenFragment";
		
		public final int GET_USER_MERCHANT_INFO = 401; 	// 대기 등록한 가맹점 정보를 가져온다.
		public final int GET_USER_INFO = 402;			// 대기 등록 정보를 가져온다.
		public final int SELECT_REMAIN_USER_TOTAL_COUNT_BEFORE_ME = 403; //  내 앞에 남은 대기인원수를 가져온다.
		
		final int SELECT_RECOMMENDATION_INFORMATION = 601; 		// 평점 정보
		
		// 폰트
		private Typeface typefaceNanumGothic= null; 
		private Typeface typefaceNanumGothicBold = null;
		
		// 서버 통신 용	 			///////////////////////////////////////////////
		int isUpdating = 0;
		Boolean countOne = true;
		WaitNumberCustomerRest waitNumberCustomerRest;
		String callResult = "";
//		String tempstr = "";
		JSONObject jsonObject;

		// 대기 등록한 가맹점 정보
		Merchant registeredMerchant ;
		String userTotalCountBeforeMe;		// 내 앞에 몇명?
		
		// 전번
		String phoneNum = "";
		// QR 관련					
		static Bitmap savedBMP = null;				// db 저장된 이미지 (인트로 페이지에서 전달받음)
		int qrSize =300;							// QR이미지 크기
		int deviceSize = 0;		
		Bitmap bmp =null;					// 이미지 생성용도
		ImageView imgView;
		public String qrCode = "";			// qr 아이디
		
		// 설정 파일 저장소  - 사용자 전번 읽기 / 쓰기 용도	
		SharedPreferences sharedPrefCustom;
		
		// 화면 관련
		View storeInfoLayout;
		
		Button storeMoreInfoBtn;
		
		TextView myQRTitleText;
		TextView rateText;
		RatingBar ratingBar;
		TextView waitNumBeforeMeText;
//		TextView myQrUserWaitingNumberText;		// 내 대기번호 -> 보여주지 않기로 함
		ProgressBar pb1;		// 중단 로딩 진행바
		
		// 뒤로가기 버튼으로 닫을때 2번만에 닫히도록
		int app_end = 0;			
		DummyActivity dummyActivity = (DummyActivity)DummyActivity.dummyActivity;

		// 프래그먼트 종료 여부. 종료된 경우 스레드 호출로 인한 에러를 방지하기 위함
		Boolean isFinished = false;
		
		
		//--------------------------------------- SQLite ---------------------------------------//
		// 테이블 생성 쿼리.
		private static final String Q_CREATE_TABLE = "CREATE TABLE user_info (" +
		"_id INTEGER PRIMARY KEY AUTOINCREMENT," +
		"key_of_data TEXT," +
		"value_of_data TEXT" +
		");" ;

		// 테이블 조회 쿼리
		private final String Q_GET_LIST = "SELECT * FROM user_info"
			+ " WHERE key_of_data = 'user_img'";
		SQLiteDatabase db = null;
		/**
		 * initDB
		 *  DB 초기화한다.
		 *
		 * @param
		 * @param
		 * @return
		 */
		public void initDB(){
			Log.i(TAG,"initDB");
			// db 관련 작업 초기화, DB 열어 SQLiteDatabase 인스턴스 생성          db 열거나 없으면 생성
			if(db== null ){
				db= getActivity().openOrCreateDatabase( "sqliteWaitNumDB.db",             
						SQLiteDatabase.CREATE_IF_NECESSARY ,null );
			}
			// 테이블에서 데이터 가져오기 전 테이블 생성 확인 없으면 생성.
			checkTableIsCreated(db);
		}
		/**
		 * checkTableIsCreated
		 *  db 테이블을 준비한다
		 *
		 * @param db
		 * @param
		 * @return
		 */
		public void checkTableIsCreated(SQLiteDatabase db){		// user_info 라는 이름의 테이블을 검색하고 없으면 생성.
			Log.i(TAG, "checkTableIsCreated");
			Cursor c = db.query( "sqlite_master" , new String[] { "count(*)"}, "name=?" , new String[] { "user_info"}, null ,null , null);
			Integer cnt=0;
			c.moveToFirst();                                 // 커서를 첫라인으로 옮김
			while(c.isAfterLast()== false ){                   // 마지막 라인이 될때까지 1씩 증가하면서 본다
				cnt=c.getInt(0);
				c.moveToNext();
			}
			//커서는 사용 직후 닫는다
			c.close();
			//테이블 없으면 생성
			if(cnt==0){
				db.execSQL(Q_CREATE_TABLE);
			}
		}
		/**
		 * getDBData
		 *  db 데이터를 꺼낸다
		 *
		 * @param
		 * @param
		 * @return
		 */
		public void getDBData(){				// db 에 있는 데이터 꺼내어 사용
			Log.i(TAG, "getDBData");
			String data_key="";
			String data_value="";
			// 조회
			Cursor c = db.rawQuery( Q_GET_LIST, null );
			if(c.getCount()==0){
				Log.i(TAG, "saved QR Image NotExist");
			}else{
				Log.i(TAG, "saved QR Image Exist");				// 데이터 있으면 꺼내서 사용함.
				c.moveToFirst();                                 // 커서를 첫라인으로 옮김
				while(c.isAfterLast()== false ){                   // 마지막 라인이 될때까지 1씩 증가하면서 본다
					data_key = c.getString(1);	
					data_value = c.getString(2);	
					c.moveToNext();
				}
				byte[] decodedString = Base64.decode(data_value, Base64.DEFAULT); 
				Bitmap decodedByte = BitmapFactory.decodeByteArray(decodedString, 0, decodedString.length);
				savedBMP = decodedByte;
				Log.i(TAG,"pass QR img");
			}
			c.close();
		}
		////-------------------------------------SQLite --------------------------------------////
		
		
	//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

		// 핸들러 등록					
		Handler handler = new Handler(){
			@Override
			public void handleMessage(Message msg){
				Bundle b = msg.getData();
				int showQR =  b.getInt("showQR");		// 값을 넣지 않으면 0 을 꺼내었다.
				if(showQR==1){
					imgView.setImageBitmap(bmp);		// 화면에 QR 보여준다.
				}
				
				// 홈 화면 대기 등록 안된 상태로 되돌리기
				if(b.getInt("initScreen")==1){	 
					myQRTitleText.setText(getString(R.string.my_qr_screen_title_register));	// 대기를 등록하세요
//					myQrUserWaitingNumberText.setVisibility(View.INVISIBLE);	 
//					myQrUserWaitingNumberText.setText(""); 
//					storeInfoLayout.setVisibility(View.INVISIBLE);	 
					waitNumBeforeMeText.setVisibility(View.INVISIBLE);	 
//					myQrUserWaitingNumberText.setVisibility(View.INVISIBLE);	 
					ratingBar.setVisibility(View.INVISIBLE);	 
					rateText.setVisibility(View.INVISIBLE);	 
					storeMoreInfoBtn.setVisibility(View.INVISIBLE);	 
					
//					waitNumBeforeMe		waitNumBeforeMeText
//					my_qr_user_waiting_number		myQrUserWaitingNumberText
//					rating_bar		ratingBar
//					rate_text		rateText
//					store_more_info_btn		storeMoreInfoBtn
					
				}
				
				// 홈 화면에 대기 정보 출력하기
				if(b.getInt("showWaitInfoYN")==1){		// 대기 정보 출력
//					storeInfoLayout.setVisibility(View.VISIBLE);
					waitNumBeforeMeText.setVisibility(View.VISIBLE);	 
//					myQrUserWaitingNumberText.setVisibility(View.VISIBLE);	 
					ratingBar.setVisibility(View.VISIBLE);	 
					rateText.setVisibility(View.VISIBLE);	 
					storeMoreInfoBtn.setVisibility(View.VISIBLE);	 
					
					myQRTitleText.setText(registeredMerchant.getCompanyName());
					if(registeredMerchant.getNumberWaiting().length()>0){
//						myQrUserWaitingNumberText.setText(" "+registeredMerchant.getNumberWaiting()+" "); 
//						myQrUserWaitingNumberText.setVisibility(View.VISIBLE);
						
						// 평점 정보 갱신
						ratingBar.setRating(Float.parseFloat(registeredMerchant.getEvaluationValue())/2);
						rateText.setText(registeredMerchant.getEvaluationValue()+"  ("+(int)Float.parseFloat(registeredMerchant.getEvaluationCount())+"명)");
						
						// *** 내 앞에 몇명?
						if(!isFinished){
							handler.sendEmptyMessage(SELECT_REMAIN_USER_TOTAL_COUNT_BEFORE_ME);
						}
					}
				}
				// 홈 화면에 내 앞에 남은 사람수 출력
				if(b.getInt("showWaitBeforeMeInfoYN")==1){		 
					if(userTotalCountBeforeMe.length()>0){
						waitNumBeforeMeText.setText(getString(R.string.wait_before_me_beforemsg)+userTotalCountBeforeMe+getString(R.string.wait_before_me_aftermsg));  //						waitNumBeforeMeText.setText("앞에 "+userTotalCountBeforeMe+" 개의 팀이 대기중입니다.");
						waitNumBeforeMeText.setVisibility(View.VISIBLE);
					}
				}
				
				// 경고창
				if(b.getInt("showAlert")==1){					 // 경고창 . 
					//
					new AlertDialog.Builder(returnThis())
					.setTitle(CommonConstant. alertTitle )                                        
					.setMessage(b.getString("msg"))
					.setIcon(R.drawable.ic_dialog_img)		
					.setPositiveButton(android.R.string.yes, new DialogInterface.OnClickListener() {
						public void onClick(DialogInterface dialog, int whichButton) {
							//
						}})
						.setNegativeButton("", null).show();
				}
				
				// 프로그래스바
				if(b.getInt("order")==1){
					// 프로그래스바 실행
					if(pb1==null){
						
					}
					pb1.setVisibility(View.VISIBLE);
				}else if(b.getInt("order")==2){
					// 프로그래스바  종료
					pb1.setVisibility(View.GONE);
				}
				
				switch (msg.what)
				{
					case GET_USER_MERCHANT_INFO : 
						if(getActivity()!=null) {
//							threadGetUserMerchantInfo();		
							getActivity().runOnUiThread(new RunnableGetUserMerchantInfo());
//							new backgroundThreadGetUserMerchantInfo().execute();
						}
						break;
					case GET_USER_INFO : 
						if(getActivity()!=null)  getActivity().runOnUiThread(new RunnableGetUserInfo());
//						new backgroundThreadGetUserInfo().execute();
						break;
					case SELECT_REMAIN_USER_TOTAL_COUNT_BEFORE_ME : 
						if(getActivity()!=null)  getActivity().runOnUiThread(new RunnableSelectRemainUserTotalCountBeforeMe());
//						new backgroundThreadSelectRemainUserTotalCountBeforeMe().execute();	
						break;
					case SELECT_RECOMMENDATION_INFORMATION  : 
						if(getActivity()!=null)  getActivity().runOnUiThread(new RunnableSelectRecommendationInformation());	
					break;
					default : 
						break;
				}

			}
		};
	
	
	
	@Override
	public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState)
	{
		
		View view = inflater.inflate(R.layout.fragment_my_qr_screen, null);
		
		pb1=(ProgressBar) view.findViewById(R.id.my_qr_screen_progressbar);
			
		waitNumberCustomerRest = new WaitNumberCustomerRest();
		
		// 화면 관련
		storeInfoLayout = view.findViewById(R.id.store_info_layout);
		imgView = (ImageView)view.findViewById(R.id.myQRCode);
		myQRTitleText = (TextView) view.findViewById(R.id.myQRTitleText);
		rateText = (TextView) view.findViewById(R.id.rate_text);
		ratingBar = (RatingBar) view.findViewById(R.id.rating_bar);
		waitNumBeforeMeText = (TextView) view.findViewById(R.id.waitNumBeforeMe);
//		myQrUserWaitingNumberText = (TextView) view.findViewById(R.id.my_qr_user_waiting_number);
		storeMoreInfoBtn = (Button) view.findViewById(R.id.store_more_info_btn);
		
		// 폰트 지정.
	    typefaceNanumGothic = Typeface.createFromAsset(getActivity().getAssets(), CommonConstant.NanumGothic);  
	    typefaceNanumGothicBold = Typeface.createFromAsset(getActivity().getAssets(), CommonConstant.NanumGothicBold);
	    myQRTitleText.setTypeface(typefaceNanumGothic);		// 폰트 적용
	    waitNumBeforeMeText.setTypeface(typefaceNanumGothic);		 
	    storeMoreInfoBtn.setTypeface(typefaceNanumGothicBold);		 
		
		// 가맹점 정보 담을 도메인 클래스
		registeredMerchant = new Merchant();
		
		// prefs
		sharedPrefCustom = getActivity().getSharedPreferences(CommonConstant.prefName,
				Context.MODE_WORLD_READABLE | Context.MODE_WORLD_WRITEABLE);		
		qrCode = sharedPrefCustom.getString("phoneNum", "");	// 저장된 사용자 QR코드 꺼냄
		if(qrCode==null || qrCode.length()<1){
			Log.e(TAG,"no Phone number-- foreign?");		 
			getActivity().finish();
		}

		// Button listener
		storeMoreInfoBtn.setOnClickListener(new OnClickListener() {
			@Override
			public void onClick(View v) {
				
				// 가맹점 상세 화면으로 이동한다. 그곳에서 추천할 수 있다.
				Intent intent = new Intent(getActivity(), MemberStoreInfoActivity.class);
//				intent.putExtra("address01", registeredMerchant.getAddress01());							// 가맹점 아이디
				intent.putExtra("companyName", registeredMerchant.getCompanyName());							// 고유 식별 번호. (상세보기 조회용도)
				intent.putExtra("evaluationCount", registeredMerchant.getEvaluationCount());					// 
				intent.putExtra("evaluationValue", registeredMerchant.getEvaluationValue());				// 
//				intent.putExtra("latitude", registeredMerchant.getLatitude());								// 
//				intent.putExtra("longtitude", registeredMerchant.getLongtitude());							// 
				intent.putExtra("merchantId", registeredMerchant.getMerchantId());							// 
//				intent.putExtra("merchantImageUrl", registeredMerchant.getMerchantImageUrl());				//
//				intent.putExtra("prStr", registeredMerchant.getPrStr());									// 
//				intent.putExtra("workPhoneNumber", registeredMerchant.getWorkPhoneNumber());				// 
//				intent.putExtra("merchantImageBmp", registeredMerchant.getMerchantImageBmp());				// 
				startActivity(intent);
//				hideKeyboard();
//				tempPhoneNum = userPhoneNumber.getText()+"";
//				if(tempPhoneNum.length()>0){
//					try {
//						handler.sendEmptyMessage(CERTIFICATION_STEP1);
//					} catch (Exception e) {
//						e.printStackTrace();
//					}
//				}else{		// 전번없음
//					showResultDialog(getString(R.string.no_phone_num));
//				}
			}
		});
		
		// 상단 타이틀 제목 , 하단 내 QR코드 번호 입력
		myQRTitleText.setText(this.getString(R.string.my_qr_screen_title_register));
		try{
			initDB();
			getDBData();
			db.close();
		}catch(Exception e){
			e.printStackTrace();
		}
		showQR();
		
		
		if(countOne){
			countOne = false;		
			// 인원수를 가져온다.
			if(!isFinished){
				handler.sendEmptyMessage(GET_USER_MERCHANT_INFO);
			}
		}else{
			Log.d(TAG,"already running..");		 
		}
		
		return view;
	}
	
	public void showQR(){
		if(getActivity()!=null) {
			// QR 이미지 삽입
			getActivity().runOnUiThread(new Runnable(){		 
				@Override
				public void run(){
					if(savedBMP==null){	// 기존 db 저장된 파일 없는경우.
						if(qrCode!=null && qrCode.length()>0){
							bmp = createQRself(qrCode);		// 자체 라이브러리 사용하여 생성.
							if(bmp==null){			// 자체 생성 실패한 경우.는 없지만 혹시 몰라서 추가함.
								Log.d(TAG,"bmp1==null");
								bmp = downloadBitmap("http://chart.apis.google.com/chart?cht=qr&chs="+qrSize+"x"+qrSize+"&choe=UTF-8&chld=H&chl="+qrCode);		// 웹 통신하여 가져옴 
								if(bmp==null){		// db 저장된 것 없고, 자체 생성도 실패했고 구글웹에서의 생성도 실패한 경우.는 없음.
									Log.d(TAG,"bmp2==null");
									getActivity().finish();
								}else{	// 웹에서 받아옴.
									saveBMPtoDB(bmp);
								}
							}else{	// 자체 성공 성공한 경우
								saveBMPtoDB(bmp);
							}
						}
					}else{	// 기존 저장된 파일 있는 경우
						bmp = savedBMP;
					}
					// showQR
					Message message = handler.obtainMessage();
					Bundle b = new Bundle();
					b.putInt("showQR", 1);
					message.setData(b);
					handler.sendMessage(message);
				}
			});
		}
		
	}
//////////////////////////////////////////////////////////////////////////////////////////////////////////
	// QR 생성 관련 메소드
		
		/**
		 * createQRself
		 *  자체 QR 생성 함수 호출한다
		 *
		 * @param qrCode
		 * @param
		 * @return bm
		 */
		public Bitmap createQRself(String qrCode){		// 자체 QR 생성
			try { 
				// generate a 200x200 QR code 
				Bitmap bm = encodeAsBitmap(qrCode, BarcodeFormat.QR_CODE, 200, 200); 
				if(bm != null) { 
					Log.d(TAG,"S to createQRself");
					return bm;
				} 
			} catch (Exception e) { 
				e.printStackTrace();
			}
			return null;
		}
		// 자체 QR 생성 용도
		private static final int WHITE = 0xFFFFFFFF;  
		private static final int BLACK = 0xFF000000;
		/**
		 * encodeAsBitmap
		 *  자체 QR 생성 한다
		 *
		 * @param contents
		 * @param format
		 * @return bitmap
		 */
		static Bitmap encodeAsBitmap(String contents,
				BarcodeFormat format, 
				int desiredWidth,         
				int desiredHeight) throws Exception {
			MultiFormatWriter writer = new MultiFormatWriter();   
			BitMatrix result = writer.encode(contents, format, desiredWidth, desiredHeight, null);   
			int width = result.getWidth();  
			int height = result.getHeight();  
			int[] pixels = new int[width * height];   
			// All are 0, or black, by default  
			for (int y = 0; y < height; y++) {
				int offset = y * width;    
				for (int x = 0; x < width; x++) {   
					pixels[offset + x] = result.get(x, y) ? BLACK : WHITE;   
				}   
			}    
			Bitmap bitmap = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888);  
			bitmap.setPixels(pixels, 0, width, 0, 0, width, height); 
			return bitmap; 
		}
		// 생성한 QR코드 이미지를 DB에 저장한다.
		/**
		 * saveBMPtoDB
		 *  생성한 QR코드 이미지를 DB에 저장한다.
		 *
		 * @param bmp
		 * @param
		 * @return
		 */
		public void saveBMPtoDB(Bitmap bmp){
			Log.d(TAG,"saveBMPtoDB");
			SQLiteDatabase db = null;
			db= getActivity().openOrCreateDatabase( "sqliteWaitNumDB.db",		     
					SQLiteDatabase.CREATE_IF_NECESSARY ,null );
			String data_key="user_img";
			String data_value="";

			// BMP -> 문자열 
			ByteArrayOutputStream baos = new ByteArrayOutputStream();   
			bmp.compress(Bitmap.CompressFormat.JPEG, 100, baos); //bm is the bitmap object    
			byte[] b = baos.toByteArray();  
			data_value = Base64.encodeToString(b, Base64.DEFAULT); 

			// 조회
			ContentValues initialValues = new ContentValues(); 
			initialValues.put("key_of_data", data_key); 
			initialValues.put("value_of_data", data_value); 
			db.insert("user_info", null, initialValues); 
			try{
				db.replaceOrThrow("user_info", null, initialValues);
			}catch(Exception e){
				e.printStackTrace();
			}
			db.close();
		}
		/*
		 * QR 이미지받기. url 사용하여 구글 웹에서 받아오기.
		 */
		/**
		 * downloadBitmap
		 *  url 사용하여 구글 웹에서  QR 이미지 받아온다
		 *
		 * @param url
		 * @param
		 * @return bitmap
		 */
		Bitmap downloadBitmap(String url) {    
			final AndroidHttpClient client = AndroidHttpClient.newInstance("Android");    
			final HttpGet getRequest = new HttpGet(url);    
			try {        
				HttpResponse response = client.execute(getRequest);        
				final int statusCode = response.getStatusLine().getStatusCode();        
				if (statusCode != HttpStatus.SC_OK) {             
					Log.w(TAG, "Error " + statusCode + " while retrieving bitmap from " + url);             
					return null;        
				}                
				final HttpEntity entity = response.getEntity();        
				if (entity != null) {            
					InputStream inputStream = null;            
					try {                
						inputStream = entity.getContent();                 
						final Bitmap bitmap = BitmapFactory.decodeStream(inputStream);                
						return bitmap;            
					} finally {                
						if (inputStream != null) {                    
							inputStream.close();                  
						}                
						entity.consumeContent();           
					}        
				}    
			} catch (Exception e) {        
				getRequest.abort();        
				Log.w(TAG, "Error while retrieving bitmap from " + url +"  " + e.toString());    
			} finally {        
				if (client != null) {            
					client.close();        
				}    
			}    
			return null;
		}
	
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////
		
		
//	/**
//	 * 대기 등록한 가맹점 정보를 가져온다.
//	 */
//	private void threadGetUserMerchantInfo() {
//		Log.d(TAG, "threadGetUserMerchantInfo");
//		Thread thread = new Thread(new Runnable() {
//			public void run() {
//				getUserMerchantInfo();
//			}
//		});
//		thread.start();
//	}
//	private void getUserMerchantInfo() {
//		Log.d(TAG, "getUserMerchantInfo");
//		// 파라미터 세팅
//		MemberUser memberUserParam = new MemberUser();
//		memberUserParam.setQrCode(qrCode);
//		// 서버 메소드 호출
//		
//		if(FragmentHome.restCallCntUp()){
//			showPb();	// ##
//			try {
//				callResult = waitNumberCustomerRest.RestGetUserMerchantInfo(memberUserParam);		// ## 
//			} catch (Exception e) {
//				e.printStackTrace();
//			}
//			FragmentHome.restCallCntDown();
//			// 결과 처리 
//			if(callResult.length()<1){	// 데이터 없음
//    			initScreen();
//				hidePb();
//    		}else if(!(callResult.equals("F"))){				//  성공
////				registeredMerchant = waitNumberCustomerRest.getMerchant();
//				try {
//					jsonObject = new JSONObject(callResult);
//					try{
//						registeredMerchant.setMerchantId(jsonObject.getString("merchantId"));
//					}catch(Exception e){
//						registeredMerchant.setMerchantId("");
//					}
//					try{
//						registeredMerchant.setNumberWaiting(jsonObject.getString("numberWaiting"));
//					}catch(Exception e){
//						registeredMerchant.setNumberWaiting("");
//					}
//					try{
//						registeredMerchant.setCompanyName(jsonObject.getString("companyName"));
//					}catch(Exception e){
//						registeredMerchant.setCompanyName("");
//					}
//					try{
//						registeredMerchant.setWorkPhoneNumber(jsonObject.getString("workPhoneNumber"));
//					}catch(Exception e){
//						registeredMerchant.setWorkPhoneNumber("");
//					}
//				} catch (JSONException e1) {
//					e1.printStackTrace();
//				}
//				
//				if(registeredMerchant.getMerchantId().equals("")){
//					// 데이터 없음.
//				}else{
//					// 모든 정보를 가져온다 
//					if(!isFinished){
//						handler.sendEmptyMessage(GET_USER_INFO);
//					}
//				}
//    		}else {	//  실패
//				hidePb();
//				try{
//					showResultDialog(getActivity().getResources().getString(R.string.request_failed));
//				}catch(Exception e){}
//    		}
//		}
//		countOne = true;		// 다시 호출 되도록 수정..
//	}
		/**
		 * 러너블. 대기 등록한 가맹점 정보를 가져온다.
		 */
		class RunnableGetUserMerchantInfo implements Runnable {
			public void run(){
				new backgroundThreadGetUserMerchantInfo().execute();
			}
		}
		/**
		 * backgroundThreadGetUserMerchantInfo
		 * 비동기   대기 등록한 가맹점 정보를 가져온다.
		 * @author blue
		 *
		 */
		public class backgroundThreadGetUserMerchantInfo extends AsyncTask<Void, Void, Void>{
			@Override protected void onPostExecute(Void result) {  
			} 
			@Override protected void onPreExecute() {  
			} 
			@Override protected Void doInBackground(Void... params) {  
				Log.d(TAG,"backgroundThreadGetUserMerchantInfo");
				
				// 파라미터 세팅
				MemberUser memberUserParam = new MemberUser();
				memberUserParam.setQrCode(qrCode);
				// 서버 메소드 호출
				showPb();	// ##
				if(FragmentHome.restCallCntUp()){
					callResult = waitNumberCustomerRest.RestGetUserMerchantInfo(memberUserParam);		// ## 
					FragmentHome.restCallCntDown();
					// 결과 처리 
					if(callResult.length()<1){	// 데이터 없음
		    			initScreen();
						hidePb();
		    		}else if(!(callResult.equals("F"))){				//  성공
//						registeredMerchant = waitNumberCustomerRest.getMerchant();
						try {
							jsonObject = new JSONObject(callResult);
							try{
								registeredMerchant.setMerchantId(jsonObject.getString("merchantId"));
							}catch(Exception e){
								registeredMerchant.setMerchantId("");
							}
							try{
								registeredMerchant.setNumberWaiting(jsonObject.getString("numberWaiting"));
							}catch(Exception e){
								registeredMerchant.setNumberWaiting("");
							}
							try{
								registeredMerchant.setCompanyName(jsonObject.getString("companyName"));
							}catch(Exception e){
								registeredMerchant.setCompanyName("");
							}
							try{
								registeredMerchant.setWorkPhoneNumber(jsonObject.getString("workPhoneNumber"));
							}catch(Exception e){
								registeredMerchant.setWorkPhoneNumber("");
							}
							
							if(registeredMerchant.getMerchantId().length()>0){
								handler.sendEmptyMessage(GET_USER_INFO);
							}
						} catch (JSONException e1) {
							e1.printStackTrace();
						}
		    		}else {	//  실패
						hidePb();
						Log.d(TAG,"backgroundThreadGetUserMerchantInfo else callResult:"+callResult);
						try{
							showResultDialog(getActivity().getResources().getString(R.string.request_failed));
						}catch(Exception e){}
		    		}
					
					
				}
				countOne = true;		// 다시 호출 되도록 수정..
				return null; 
			}
		}
		
		
		/**
		 * 러너블. 대기 등록 정보를 가져온다.
		 */
		class RunnableGetUserInfo implements Runnable {
			public void run(){
				new backgroundThreadGetUserInfo().execute();
			}
		}
		/**
		 * backgroundThreadGetUserInfo
		 * 비동기   대기 등록 정보를 가져온다.
		 * @author blue
		 *
		 */
		public class backgroundThreadGetUserInfo extends AsyncTask<Void, Void, Void>{
			@Override protected void onPostExecute(Void result) {  
			} 
			@Override protected void onPreExecute() {  
			} 
			@Override protected Void doInBackground(Void... params) {  
				Log.d(TAG,"backgroundThreadGetUserInfo");
				
				// 파라미터 세팅
				MemberUser memberUserParam = new MemberUser();
				memberUserParam.setQrCode(qrCode);
				Merchant merchantParam = new Merchant();
				merchantParam.setMerchantId(registeredMerchant.getMerchantId());
				
				// 서버 메소드 호출
//				showPb(); // @@ 
				if(FragmentHome.restCallCntUp()){
					callResult = waitNumberCustomerRest.RestGetUserInfo(memberUserParam, merchantParam);
					FragmentHome.restCallCntDown();
//					hidePb();	// 
					// 결과 처리 
					if(!(callResult.equals("F"))){				//  성공
						try {
							// 데이터 세팅부..
							jsonObject = new JSONObject(callResult);
							try{
								registeredMerchant.setNumberWaiting(jsonObject.getString("numberWaiting"));		// 대기 번호 
							}catch(Exception e){
								registeredMerchant.setNumberWaiting("");
							}
							try{
								registeredMerchant.setNextTurnYn(jsonObject.getString("nextTurnYn"));		// 다음 차례인지
							}catch(Exception e){
								registeredMerchant.setNextTurnYn("");
							}
							try{
								registeredMerchant.setIdWaitingUsers(jsonObject.getString("idWaitingUsers"));		// 일단 저장
							}catch(Exception e){
								registeredMerchant.setIdWaitingUsers("");
							}
							// 해당 가맹점 평점도 가져온다
							if(!isFinished){
								handler.sendEmptyMessage(SELECT_RECOMMENDATION_INFORMATION);
							}
						} catch (JSONException e) {
							e.printStackTrace();
							hidePb();
						} 
		    		}else{	//  실패
		    			hidePb();
		    			try{
							showResultDialog(getActivity().getResources().getString(R.string.request_failed));
						}catch(Exception e){}
						countOne = true;
		    		}
				}
				return null; 
			}
		}
		
		
		/**
		 * 러너블.  내 앞에 남은 대기인원수를 가져온다.
		 */
		class RunnableSelectRemainUserTotalCountBeforeMe implements Runnable {
			public void run(){
				new backgroundThreadSelectRemainUserTotalCountBeforeMe().execute();	
			}
		}
		/**
		 * backgroundThreadSelectRemainUserTotalCountBeforeMe
		 * 비동기    내 앞에 남은 대기인원수를 가져온다.
		 * @author blue
		 *
		 */
		public class backgroundThreadSelectRemainUserTotalCountBeforeMe extends AsyncTask<Void, Void, Void>{
			@Override protected void onPostExecute(Void result) {  
			} 
			@Override protected void onPreExecute() {  
			} 
			@Override protected Void doInBackground(Void... params) {  
				Log.d(TAG,"backgroundThreadSelectRemainUserTotalCountBeforeMe");
				
				// 파라미터 세팅
				Merchant merchantParam = new Merchant();
				merchantParam.setMerchantId(registeredMerchant.getMerchantId());
				merchantParam.setNumberWaiting(registeredMerchant.getNumberWaiting());
				// 서버 메소드 호출
//				showPb(); // @@
				if(FragmentHome.restCallCntUp()){
					if(!isFinished){
						callResult = waitNumberCustomerRest.RestSelectRemainUserTotalCountBeforeMe(merchantParam);
					}
					FragmentHome.restCallCntDown();
					if(!isFinished){
						// 결과 처리 
						if(!(callResult.equals("F"))){				//  성공
							try {
								jsonObject = new JSONObject(callResult);
								try{
									userTotalCountBeforeMe = jsonObject.getString("totalCount"); 
								}catch(Exception e){
									userTotalCountBeforeMe = "";
								}
								showWaitBeforeMeInfo();
							} catch (JSONException e) {
								e.printStackTrace();
							} 
							hidePb();	// 
							countOne = true;		// 다시 호출 되도록 수정..
						}else{	//  실패
			    			hidePb();
			    			try{
								showResultDialog(getActivity().getResources().getString(R.string.request_failed));
							}catch(Exception e){}
							countOne = true;
			    		}
					}
				}
				return null; 
			}
		}
		
		/**
		 * 러너블. 가맹점에 대한 사용자들의 추천 목록을 가져온다. - 평점 갱신용도
		 */
		class RunnableSelectRecommendationInformation implements Runnable {
			public void run(){
				new backgroundSelectRecommendationInformation().execute();
			}
		}
		/**
		 * backgroundSelectRecommendationInformation
		 *  비동기로 가맹점에 대한 사용자들의 정보 가져온다. - 평점 갱신용도
		 *
		 * @param
		 * @param
		 * @return
		 */
		public class backgroundSelectRecommendationInformation extends   AsyncTask<Void, Void, Void> {
			@Override protected void onPostExecute(Void result) { 
			}
			@Override protected void onPreExecute() { 
			}
			@Override protected Void doInBackground(Void... params) { 
				Log. d(TAG,"backgroundSelectRecommendationInformation");

				//				// 파리미터 세팅
				Merchant merchantParam = new Merchant();
				
				merchantParam.setMerchantId(registeredMerchant.getMerchantId());
				// 호출
				// if(!pullDownRefreshIng){
//				showPb(); // @@
				// }
				callResult = waitNumberCustomerRest.RestSelectRecommendationInformation(merchantParam);
//				hidePb();	// @@ 
				// 결과 처리	 
				if(!(callResult.equals("F"))){ //  성공
					// 평점 갱신한다.
					processMerchantStoreInfoData(callResult);	
				}else{ 					//  실패
				}
				showWaitInfo();

				
////				 추천 중복 체크하고, 리뷰 리스트를 보여준다.
////				handler.sendEmptyMessage(SELECT_DUPLICATION_MEMBER_RECOMMENDATION);		//			showInfo(); // 나중에 평점도 갱신한다
				return null ;
			}
		}
		
	//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
	/**
	 * 서버로부터 받아온 가맹점 정보를 파싱하여 화면에 뿌려준다.
	 */
	public void processMerchantStoreInfoData(String callResult){
		String str = "";
		try {
			jsonObject = new JSONObject(callResult);
			// 데이터를 전역 변수 도메인에 저장하고 핸들러를 통해 도메인-> 화면에 보여준다..
			try{
				str = jsonObject.getString("totalEvaluation");
				if(str==null || str.equals("null")){
					str = "0";
				}
				registeredMerchant.setEvaluationTotal(str);			// 총점	
			}catch(Exception e){
				registeredMerchant.setEvaluationTotal("0");
			}
			try{
				str = jsonObject.getString("totalMember");
				if(str==null || str.equals("null")){
					str = "0";
				}
				registeredMerchant.setEvaluationCount(str);			// 추천수	
			}catch(Exception e){
				registeredMerchant.setEvaluationCount("0");
			}
			try{
				str = jsonObject.getString("averageEvaluation");
				if(str==null || str.equals("null")){
					str = "0";
				}
				registeredMerchant.setEvaluationValue(str);			// 평점
			}catch(Exception e){
				registeredMerchant.setEvaluationValue("0");
			}
		} catch (JSONException e) {
			e.printStackTrace();
		} 
	}
	
	//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
	// Utils
		
		/**
		 * initScreen
		 *  대기등록되지 않은 상태로 화면을 초기화한다.
		 *
		 * @param 
		 * @param 
		 * @return 
		 */
		public void initScreen(){
			Log.d(TAG, "initScreen");
			if(!isFinished){
				getActivity().runOnUiThread(new Runnable(){		 
					@Override
					public void run(){
						Message message = handler.obtainMessage();
						Bundle b = new Bundle();
						b.putInt("initScreen", 1);		// 보여주기.
						message.setData(b);
						handler.sendMessage(message);
					}
				});
			}
		}
		
		/**
		 * showWaitInfo
		 *  화면에 데이터 보여준다
		 *
		 * @param 
		 * @param 
		 * @return 
		 */
		public void showWaitInfo(){
			Log.d(TAG, "showWaitInfo");
			if(!isFinished){
				getActivity().runOnUiThread(new Runnable(){		
					@Override
					public void run(){
						Message message = handler.obtainMessage();
						Bundle b = new Bundle();
						b.putInt("showWaitInfoYN", 1);		// 보여주기.
						message.setData(b);
						handler.sendMessage(message);
					}
				});
			}
		}
		/**
		 * showWaitBeforeMeInfo
		 *  화면에 데이터 보여준다
		 *
		 * @param 
		 * @param 
		 * @return 
		 */
		public void showWaitBeforeMeInfo(){
			Log.d(TAG, "showWaitBeforeMeInfo");
			if(!isFinished){
				getActivity().runOnUiThread(new Runnable(){		 
					@Override
					public void run(){
						Message message = handler.obtainMessage();
						Bundle b = new Bundle();
						b.putInt("showWaitBeforeMeInfoYN", 1);		// 보여주기.
						message.setData(b);
						handler.sendMessage(message);
					}
				});
			}
		}
		
		/**
		 * returnThis
		 *  컨택스트 리턴한다
		 *
		 * @param
		 * @param
		 * @return
		 */
		public Context returnThis(){
			return getActivity();
		}
		
		/**
		 * showResultDialog
		 *  얼럿 띄운다
		 *
		 * @param msg
		 * @param
		 * @return 
		 */
		public void showResultDialog(final String msg){
			if(!isFinished){
				getActivity().runOnUiThread(new Runnable(){	 
					@Override
					public void run(){
						Message message = handler.obtainMessage();				
						Bundle b = new Bundle();
						b.putInt("showAlert", 1);
						b.putString("msg", msg);			// 화면에 보여줄 메시지
						message.setData(b);
						handler.sendMessage(message);
					}
				}
			);
			}
		}
		
		
		// 중앙 프로그래스바 보임, 숨김
		/**
		 * showPb
		 *  중앙 프로그래스바 가시화한다
		 *
		 * @param
		 * @param
		 * @return
		 */
		public void showPb(){
			if(!isFinished){
				getActivity().runOnUiThread(new Runnable(){		 
					@Override
					public void run(){
						Message message = handler .obtainMessage();
						Bundle b = new Bundle();
						b.putInt( "order" , 1);
						message.setData(b);
						handler .sendMessage(message);
					}
				});
			}
		}
		/**
		 * hidePb
		 *  중앙 프로그래스바 비가시화한다
		 *
		 * @param
		 * @param
		 * @return
		 */
		public void hidePb(){
			if(!isFinished){
				getActivity().runOnUiThread(new Runnable(){		 
					@Override
					public void run(){
						Message message = handler .obtainMessage();
						Bundle b = new Bundle();
						b.putInt( "order" , 2);
						message.setData(b);
						handler .sendMessage(message);
					}
				});
			}
		}
		
		@Override
		public void onResume(){
			super.onResume();
			isFinished = false;
			FragmentHome.app_end = 0;
		}

		@Override
		public void onPause(){
			super.onPause();
			isFinished = true;
		}

		
	//////////////////////////////////////////////////////////////////////////////////////////////////////////////////
	}